#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
mysql 封装，支持 增、删、改、查
"""
from warnings import filterwarnings
import pymysql
import logging
from base_test_case import BaseTestCase
from utils.logger import Logger
logger = Logger()

# 忽略 Mysql 告警信息
filterwarnings("ignore", category=pymysql.Warning)


class MysqlDB(BaseTestCase):
    """ mysql 封装 """

    def __init__(self):
        try:
            # 建立数据库连接
            self.conn = pymysql.connect(
                host=self.read("mysql", "host"),
                user=self.read(" ", "user_name"),
                password=self.read("mysql", "password"),
                port=int(self.read("mysql", "port")),
                database="phoenix"
            )

            # 使用 cursor 方法获取操作游标，得到一个可以执行sql语句，并且操作结果为字典返回的游标
            self.cur = self.conn.cursor(cursor=pymysql.cursors.DictCursor)
            logging.info("数据库链接成功")
        except AttributeError as error:
            logging.error("数据库连接失败，失败原因 %s", error)

    def __del__(self):
        try:
            # 关闭游标
            print("==============================================")
            self.cur.close()
            # 关闭连接
            self.conn.close()
        except AttributeError as error:
            logging.error("数据库连接失败，失败原因 %s", error)

    def query(self, sql, state=""):
        """
            查询
            :param sql:
            :param state:  all 是默认查询全部
            :return:
            """
        try:
            self.cur.execute(sql)
            logger.info("执行sql:" + sql)
            if state == "all":
                # 查询全部
                data = self.cur.fetchall()
            else:
                # 查询单条
                data = self.cur.fetchone()
            return data
        except AttributeError as error_data:
            logging.error("数据库连接失败，失败原因 %s", error_data)
            raise

    def execute(self, sql):
        """
            更新 、 删除、 新增
            :param sql:
            :return:
            """
        try:
            # 使用 execute 操作 sql
            rows = self.cur.execute(sql)
            # 提交事务
            self.conn.commit()
            return rows
        except AttributeError as error:
            logging.error("数据库连接失败，失败原因 %s", error)
            # 如果事务异常，则回滚数据
            self.conn.rollback()
            raise